home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 17 / CU Amiga Magazine's Super CD-ROM 17 (1997)(EMAP Images)(GB)[!][issue 1997-12].iso / CUCD / Programming / DiceSource / src / alib / csup / math_support / ffpfpa.asm < prev    next >
Assembly Source File  |  1994-02-14  |  9KB  |  186 lines

  1.  
  2. *        TTL       FAST FLOATING POINT FLOAT TO ASCII (FFPFPA)
  3. ***************************************
  4. * (C) COPYRIGHT 1980 BY MOTOROLA INC. *
  5. ***************************************
  6.  
  7. ******************************************************
  8. *                     FFPFPA                         *
  9. *                 FLOAT TO ASCII                     *
  10. *                                                    *
  11. *    INPUT:  D7 - FLOATING POINT NUMBER              *
  12. *                                                    *
  13. *    OUTPUT: D7 - THE BASE TEN EXPONENT IN BINARY    *
  14. *                 FOR THE RETURNED FORMAT            *
  15. *            SP - DECREMENTED BY 14 AND              *
  16. *                 POINTING TO THE CONVERTED          *
  17. *                 NUMBER IN ASCII FORMAT             *
  18. *                                                    *
  19. *            ALL OTHER REGISTERS UNAFFECTED          *
  20. *                                                    *
  21. *    CONDITION CODES:                                *
  22. *            N - SET IF THE RESULT IS NEGATIVE       *
  23. *            Z - SET IF THE RESULT IS ZERO           *
  24. *            V - CLEARED                             *
  25. *            C - CLEARED                             *
  26. *            X - UNDEFINED                           *
  27. *                                                    *
  28. *   CODE SIZE: 192 BYTES   STACK WORK AREA: 42 BYTES *
  29. *                                                    *
  30. *                                                    *
  31. *            {S}{'.'}{DDDDDDDD}{'E'}{S}{DD}          *
  32. *            <     FRACTION   >< EXPONENT >          *
  33. *                                                    *
  34. *        WHERE  S - SIGN OF MANTISSA OR EXPONENT     *
  35. *                   ('+' OR '-')                     *
  36. *               D - DECIMAL DIGIT                    *
  37. *                                                    *
  38. *        STACK OFFSET OF RESULT  S.DDDDDDDDESDD      *
  39. *        AFTER RETURN            00000000001111      *
  40. *                                01234567890123      *
  41. *                                                    *
  42. *                                                    *
  43. *        EXAMPLES   +.12000000E+03  120              *
  44. *                   +.31415927E+01  PI               *
  45. *                   +.10000000E-01  ONE-HUNDREDTH    *
  46. *                   -.12000000E+03  MINUS 120        *
  47. *                                                    *
  48. *     NOTES:                                         *
  49. *       1) THE BINARY BASE 10 EXPONENT IS RETURNED   *
  50. *          IN D7 TO FACILITATE CONVERSIONS TO        *
  51. *          OTHER FORMATS.                            *
  52. *       2) EVEN THOUGH EIGHT DIGITS ARE RETURNED,THE *
  53. *          PRECISION AVAILABLE IS ONLY 7.167 DIGITS. *
  54. *          ROUNDING SHOULD BE PERFORMED WHEN LESS    *
  55. *          THAN EIGHT DIGITS ARE ACTUALLY UTILIZED   *
  56. *          IN THE MANTISSA.                          *
  57. *       3) THE STACK IS LOWERED BY 14 BYTES BY THIS  *
  58. *          ROUTINE.  THE RETURN ADDRESS IS REPLACED  *
  59. *          BY A PORTION OF THE RESULTS               *
  60. *                                                    *
  61. *  TIME: (8MHZ NO WAIT STATES ASSUMED)               *
  62. *        330 MICROSECONDS CONVERTING THE SAMPLE      *
  63. *        VALUE OF 55.55 TO ASCII.                    *
  64. *                                                    *
  65. ******************************************************
  66.          PAGE
  67. *FFPFPA   IDNT      1,1  FFP FLOAT TO ASCII
  68.  
  69. *         OPT       PCS
  70.  
  71.          XREF      FFP10TBL  POWER OF TEN TABLE
  72.  
  73.          XDEF      FFPFPA    ENTRY POINT
  74.  
  75. * STACK DEFINITION
  76. STKOLD   EQU       48       PREVIOUS CALLERS STACK POINTER
  77. STKEXP   EQU       46       EXPONENT
  78. STKEXPS  EQU       45       EXPONENTS SIGN
  79. STKLTRE  EQU       44       'E'
  80. STKMANT  EQU       36       MANTISSA
  81. STKPER   EQU       35       '.'
  82. STKMANS  EQU       34       MANTISSA'S SIGN
  83. STKNEWRT EQU       30       NEW RETURN POSITION
  84. STKRTCC  EQU       28       RETURN CONDITION CODE
  85. STKSAVE  EQU       0        REGISTER SAVE AREA
  86.  
  87.  
  88. FFPFPA:
  89.          LEA       -10(SP),SP            SET STACK TO NEW LOCATION
  90.          MOVE.L    10(SP),-(SP)            SAVE RETURN
  91.          MOVE.W    #0,-(SP)                SAVE FOR RETURN CODE
  92.          TST.B     D7                    TEST VALUE
  93. *        MOVE.W    SR,-(SP)                SAVE FOR RETURN CODE (NOTE: COMMENTED OUT)
  94.          MOVEM.L   D2-D6/A0/A1,-(SP)    SAVE REGISTERS
  95.  
  96. * ADJUST FOR ZERO VALUE
  97.          BNE.S     FPFNOT0                BRANCH NO ZERO INPUT
  98.          MOVEQ     #$41,D7                SETUP PSUEDO INTEGER EXPONENT
  99.  
  100. * SETUP MANTISSA'S SIGN
  101. FPFNOT0  MOVE.W    #'+.',STKMANS(SP)    INSERT PLUS AND DECIMAL
  102.          MOVE.B    D7,D6                COPY SIGN+EXPONENT
  103.          BPL.S     FPFPLS                BRANCH IF PLUS
  104.          ADDQ.B    #2,STKMANS(SP)        CHANGE PLUS TO MINUS
  105.  
  106. * START SEARCH FOR MAGNITUDE IN BASE 10 POWER TABLE
  107. FPFPLS   ADD.B     D6,D6     SIGN OUT OF PICTURE
  108.          MOVE.B    #$80,D7   SET ROUDING FACTOR FOR SEARCH
  109.          EOR.B     D7,D6     CONVERT EXPONENT TO BINARY
  110.          EXT.W     D6        EXPONENT TO WORD
  111.          ASR.W     #1,D6     BACK FROM SIGN EXTRACTMENT
  112.          MOVEQ     #1,D3     START BASE TEN COMPUTATION
  113.          LEA       FFP10TBL,A0 START AT TEN TO THE ZERO
  114.          CMP.W     (A0),D6   COMPARE TO TABLE
  115.          BLT.S     FPFMIN    BRANCH MINUS EXPONENT
  116.          BGT.S     FPFPLU    BRANCH PLUS EXPONENT
  117. FPFEQE   CMP.L     2(A0),D7  EQUAL SO COMPARE MANTISSA'S
  118.          BCC.S     FPFFND    BRANCH IF INPUT GREATER OR EQUAL THAN TABLE
  119. FPFBCK   ADDQ.W    #6,A0     TO NEXT LOWER ENTRY IN TABLE
  120.          SUBQ.W    #1,D3     DECREMENT BASE 10 EXPONENT
  121.          BRA.S     FPFFND    BRANCH POWER OF TEN FOUND
  122.  
  123. * EXPONENT IS HIGHER THAN TABLE
  124. FPFPLU   LEA       -6(A0),A0 TO NEXT HIGHER ENTRY
  125.          ADDQ.W    #1,D3     INCREMENT POWER OF TEN
  126.          CMP.W     (A0),D6   TEST NEW MAGNITUDE
  127.          BGT.S     FPFPLU    LOOP IF STILL GREATER
  128.          BEQ.S     FPFEQE    BRANCH EQUAL EXPONENT
  129.          BRA.S     FPFBCK    BACK TO LOWER AND FOUND
  130.  
  131. * EXPONENT IS LOWER THAN TABLE
  132. FPFMIN   LEA       6(A0),A0  TO NEXT LOWER ENTRY
  133.          SUBQ.W    #1,D3     DECREMENT POWER OF TEN Y ONE
  134.          CMP.W     (A0),D6   TEST NEW MAGNITUDE
  135.          BLT.S     FPFMIN    LOOP IF STILL LESS THAN
  136.          BEQ.S     FPFEQE    BRANCH EQUAL EXPONENT
  137.  
  138. * CONVERT THE EXPONENT TO ASCII
  139. FPFFND   MOVE.L    #'E+00',STKLTRE(SP) SETUP EXPONENT PATTERN
  140.          MOVE.W    D3,D2     ? EXPONENT POSITIVE
  141.          BPL.S     FPFPEX    BRANCH IF SO
  142.          NEG.W     D2        ABSOLUTIZE
  143.          ADDQ.B    #2,STKEXPS(SP) TURN TO MINUS SIGN
  144. FPFPEX   CMP.W     #10,D2    ? TEN OR GREATER
  145.          BCS.S     FPFGEN    BRANCH IF NOT
  146.          ADDQ.B    #1,STKEXP(SP) CHANGE ZERO TO ONE
  147.          SUB.W     #10,D2    ADJUST TO DECIMAL
  148. FPFGEN   OR.B      D2,STKEXP+1(SP) FILL IN LOW DIGIT
  149.  
  150. * GENERATE THE MANTISSA IN ASCII A0->TABLE  D7=BINARY MANTISSA
  151. * D5 - MANTISSA FROM TABLE       D6.W = BINARY EXPONENT
  152. * D4 - SHIFT AND DIGIT BUILDER   D2 = DBRA MANTISSA DIGIT COUNT
  153. * A1->MANTISSA STACK POSITION
  154.          MOVEQ     #7,D2     COUNT FOR EIGHT DIGITS
  155.          LEA       STKMANT(SP),A1 POINT TO MANTISSA START
  156.          TST.L     D7        ? ZERO TO CONVERT
  157.          BPL.S     FPFZRO    BRANCH IF SO TO NOT ROUND
  158.          TST.B     5(A0)     ? 24 BIT PRECISE IN TABLE
  159.          BNE.S     FPFNXI    BRANCH IF NO TRAILING ZEROES
  160. FPFZRO   CLR.B     D7        CLEAR ADJUSTMENT FOR .5 LSB PRECISION
  161. FPFNXI   MOVE.W    D6,D4     COPY BINARY EXPONENT
  162.          SUB.W     (A0)+,D4  FIND NORMALIZATION FACTOR
  163.          MOVE.L    (A0)+,D5  LOAD MANTISSA FROM TABLE
  164.          LSR.L     D4,D5     ADJUST TO SAME EXPONENT
  165.          MOVEQ     #9,D4     START AT NINE AND COUNT DOWN
  166. FPFINC   SUB.L     D5,D7     SUBTRACT FOR ANOTHER COUNT
  167.          DBCS      D4,FPFINC DECREMENT AND BRANCH IF OVER
  168.          BCS.S     FPFNIM    BRANCH NO IMPRECISION
  169.          CLR.B     D4        CORRECT RARE UNDERFLOW DUE TO TABLE IMPRECISION
  170. FPFNIM   ADD.L     D5,D7     MAKE UP FOR OVER SUBTRACTION
  171.          SUB.B     #9,D4     CORRECT VALUE
  172.          NEG.B     D4        TO BETWEEN 0 AND 9 BINARY
  173.          OR.B      #'0',D4   CONVERT TO ASCII
  174.          MOVE.B    D4,(A1)+  INSERT INTO ASCII MANTISSA PATTERN
  175.          DBF       D2,FPFNXI BRANCH IF MORE DIGITS TO GO
  176.  
  177. * RETURN WITH BASE TEN EXPONENT BINARY IN D7
  178.          MOVE.W    D3,D7     TO D7
  179.          EXT.L     D7        TO FULL WORD
  180.          MOVEM.L   (SP)+,D2-D6/A0/A1 RESTORE REGISTERS
  181. *        RTR                 RETURN WITH PROPER CONDITION CODE
  182.          ADDQ.L    #2,SP
  183.          RTS
  184.  
  185.          END
  186.